package com.itheima.sh.test;

import com.itheima.sh.dao.UserMapper;
import com.itheima.sh.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.InputStream;
import java.util.List;
/*
    建造者模式: 创建对象
    工厂设计模式: 创建对象
    代理模式: 动态代理(a. 创建代理对象 b. 基于接口)
 */
public class MyBatisTest01 {

    //从MySQL中查询所有的用户
    @Test
    public void test02() throws Exception{
        //TODO: 1.从xml文件中构建SqlSessionFactory (读取 mybatis-config.xml 核心配置文件 并解析: 类似于dom4j)
        //定义核心配置文件路径
        String resource = "mybatis-config.xml";
        //加载核心配置文件获取输入流(从类路径下加载指定文件名: resources目录 )
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //TODO: 2.从SqlSessionFactory中获取session (理解成Connection: java程序和数据库之间的链接)
        SqlSession session = sqlSessionFactory.openSession();

        //TODO: 3.使用session获取接口的动态代理对象
        //接口类型 变量 = 接口的实现类对象
        //在源码里面并没看到实现类在哪里, 那说明实现类是运行时动态生成的(动态代理)
        // invoke方法的实现: 根据 接口映射文件 编写的(jdbc)
        UserMapper mapper = session.getMapper(UserMapper.class);
        //TODO: 4.使用接口类型的对象调用接口中的方法
        List<User> userList = mapper.findAllUsers();
        //5.遍历集合
        for (User user : userList) {
//            System.out.println(user); // 打印黑字: 普通信息
            System.err.println(user); // 打印红字: 一般用来打印异常信息
        }
        //关闭会话
        session.close();
    }
}
